package com.iwuyc.tools.commons.structs.basic;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

@Getter
@Setter
@ToString
public class RestResult<T extends Serializable> {
    /**
     * 成功的编码
     */
    public static final Integer SUCCESS_CODE = 0;
    /**
     * 执行结果编码
     */
    private final Integer code;
    /**
     * 消息
     */
    private final String message;
    /**
     * 数据
     */
    private final T data;

    public RestResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }


    /**
     * 增加成功的返回结果
     *
     * @param data    返回数据
     * @param message 返回消息
     * @param <T>     返回数据类型
     * @return 返回结果
     */
    public static <T extends Serializable> RestResult<T> success(T data, String message) {
        return new RestResult<>(SUCCESS_CODE, message, data);
    }

    /**
     * 增加成功的返回结果
     *
     * @param data 返回数据
     * @param <T>  返回数据类型
     * @return 返回结果
     */
    public static <T extends Serializable> RestResult<T> success(T data) {
        return success(data, "success");
    }

    /**
     * 增加成功的返回结果
     *
     * @param <T> 返回数据类型
     * @return 返回结果
     */
    public static <T extends Serializable> RestResult<T> success() {
        return success(null);
    }

    /**
     * 增加失败的返回结果
     *
     * @param code    错误码
     * @param message 错误消息
     * @param data    返回数据
     * @param <T>     返回数据类型
     * @return 返回结果
     */
    public static <T extends Serializable> RestResult<T> fail(Integer code, String message, T data) {
        return new RestResult<>(code, message, data);
    }

    /**
     * 增加失败的返回结果
     *
     * @param code    错误码
     * @param message 错误消息
     * @param <T>     返回数据类型
     * @return 返回结果
     * @author Neil
     * @since 2024-05-25
     */
    public static <T extends Serializable> RestResult<T> fail(Integer code, String message) {
        return fail(code, message, null);
    }

    /**
     * 增加失败的返回结果
     *
     * @param code    错误码
     * @param <T>     返回数据类型
     * @return 返回结果
     * @author Neil
     * @since 2024-05-25
     */
    public static <T extends Serializable> RestResult<T> fail(Integer code) {
        return fail(code, "fail");
    }
}
